package com.yangfan.executor;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @description:
 * @author: yangfan
 * @date: Created in 2020/4/2 0002 9:22
 * @modified By:
 */
public class ExecutorExample {


    /**
     * 最常用的 固定线程数量线程池 线程数量与最大线程数量一样 ， 不对线程进行回收 ，线程队列默认是最大
     * <p>
     * new ThreadPoolExecutor(nThreads, nThreads,
     * 0L, TimeUnit.MILLISECONDS,
     * new LinkedBlockingQueue<Runnable>());
     */
    public void newFixedThreadPool() {
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(10);
    }


    /**
     * 缓存线程池 默认里面没有线程 ， {@link java.util.concurrent.SynchronousQueue} 队列的大小是 1 只能存放一个任务的队列，
     * 来一个任务就会创建一个线程进行用于短连接任务，大量场链接访问会造成 JVM 瘫痪
     * <p>
     * new ThreadPoolExecutor(0, Integer.MAX_VALUE,
     * 60L, TimeUnit.SECONDS,
     * new SynchronousQueue<Runnable>());
     */
    public void newCachedThreadPool() {
        ExecutorService cachedThreadPool = Executors.newCachedThreadPool();

    }

    /**
     *
     * 只有一个线程的 线程池， 面试题 这个线程池只有一个线程 那与 new Thread() 有啥区别呢？
     * 任务是一个一个的执行。
     *
     * 1. 线程 运行完毕会被回收，二线程池内的不会被回收。
     * 2. 线程没有 LinkedBlockingQueue 用来保存 任务 ， 而线程池有。
     *
     * new FinalizableDelegatedExecutorService
     * (new ThreadPoolExecutor(1, 1,
     * 0L, TimeUnit.MILLISECONDS,
     * new LinkedBlockingQueue<Runnable>()));
     */
    public void newSingleThreadExecutor() {
        ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
    }


}
